/**
 * @description:
 * @title: RedisServiceDemo
 * @author: zp
 * @date: 2021/9/4 15:57
 * redis 查看版本的命令(版本6.0.8)
 * <p>
 * 查看redis默认内存大小
 * redis.conf maxremory 在64位操作系统 默认内存大小等于电脑最大内存大小不做限制 在32位操作系统 最大内存3G
 * 一般推荐设置成实际内存的 3/4
 * <p>
 * redis的内存删除方式（最大的原因：可能惰性时 有key一直未被使用 或者定时时 一直未被抽中 导致还是有时间无法被删除）
 * 定期删除 设置定期时间和频率 要根据服务器的数据动态设置不然容易降级成定时或者惰性删除
 * 定时删除 固定时间扫描redis内存数据 也是随机抽查 但是对CPU的负担加重
 * 惰性删除 对内存不友好 但是节约了CPU的开支 但是存在未使用的key一直无法被删除
 * <p>
 * 兜底的淘汰策略
 * noeviction：不会驱逐任何key（默认设置的删除策略）
 * allkeys-lru：对所有的key进行 LRU算法进行删除
 * volatile-lru: 对所有的设置了过期时间的key进行 LRU算法进行删除
 * allkeys-random：对所有的key进行随机删除
 * volatile-random：对所有设置了过期时间的key进行随机删除
 * volatile-ttl：删除马上要过期的key
 * allkeys-lfu：对所有的key进行lfu算法删除
 * volatile-lfu：对所有设置了过期时间的key使用lfu算法进行删除
 * <p>
 * 命令不区分大小写 key区分大小写
 * 查看帮助方法 help @需要查找的类型
 * <p>
 * redis-server -v
 * 或者连接上 info
 * <p>
 * 数据类型：常见
 * list 公众号订阅
 * set 抽奖小程序 朋友圈点赞 qq推荐可能认识的人 微博关注好友社交关系
 * 可以取 交集 并集 差集 运算
 * zset（排序的set） 设置分数 可以排序 游戏排行榜 热销商品
 * string 点赞 收藏数量 阅读数量
 * hash 购物车（中小厂） 对应java的Map<String,map<String,String>>
 * 不常见
 * bitmap
 * HyperLogLog
 * GEO
 * Stream
 * <p>
 * 选项
 * 在SET命令支持一组修改其行为的选项：
 * <p>
 * EX seconds -- 设置指定的过期时间，以秒为单位。
 * PX 毫秒-- 设置指定的过期时间，以毫秒为单位。
 * EXAT timestamp-seconds -- 设置密钥到期的指定 Unix 时间，以秒为单位。
 * PXAT timestamp-milliseconds -- 设置指定的 Unix 时间，密钥将到期，以毫秒为单位。
 * NX -- 仅在不存在的情况下设置密钥。
 * XX -- 仅设置已存在的密钥。
 * KEEPTTL -- 保留与密钥关联的生存时间。
 * GET -- 返回存储在 key 中的旧字符串，如果 key 不存在，则返回 nil。如果 key 中存储的值不是字符串，则返回错误并中止SET。
 * 注意：由于SET命令选项可以替换SETNX、SETEX、PSETEX、GETSET，因此在未来的 Redis 版本中，这些命令可能会被弃用并最终被删除。
 * <p>
 * 对于分布式锁使用redLock（原因）
 * 1、在代码层面添加juc 或者 synchronized 但是需要区分（单机版的）
 * synchronized 不见不散 就是除非执行完毕或者出现异常 不然不会释放锁 造成阻塞
 * lock 可以使用tryLock 设置时间 或者直接判断是否可以获取锁 如果不可以 就走另一个判断分支
 * 2、使用nginx的情况下会出现超卖问题 使用setnx 添加唯一的key 如果存在不执行 如果不存在执行
 * 3、把代码添加到 finally中 使代码块一定会执行
 * 4、需要设置过期时间 保证当出现被kill 或者其他突发情况下也可以释放锁
 * 5、把过期时间和key value的设置使用一条命令执行保持原子性
 * 6、需要先获取元素的value（value是唯一的） 如果和服务器中保存的value相等 才可以删除key 防止误删的情况发生
 * 7、在判断value和delete的操作当中 不保存原子性 需要添加lua实现原子性 （如果不能使用lua脚本 可以通过redis事物确保 但是redis事物不具有原子性 应付面试）
 * 8、涉及到自动续锁 在接口超时或者其他阻塞情况 需要程序自动对redis的锁续锁
 * 9、异步复制 redis无法确保lock的信息丢失 主机和从机的数据无法完成同步（设计多台redis中（n/2+1）台redis服务器中有锁
 * 才能认为加锁成功 当出现情况下需要所有redis的服务器中锁删除）
 * <p>
 * redLock注意事项
 * 使用redLock 在释放锁的时候 应该先判断是否加锁 是否是同一个线程持有锁 isLocked和isHeldByCurrentThread方法判断
 */
public class RedisServiceDemo {
}
